﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OffInvoiceExcelAddIn.UBLFiles
{
    /// <summary>
    /// Clase utilizada de almacén de datos que conecta los datos introducidos en la plantilla
    /// con los datos con los que se generarán las facturas
    /// </summary>
    public class FacturaeFieldAndValues
    {

        #region "Fields"

        /// <summary>
        /// Campo privado que contiene el diccionario de todos los datos de la plantilla con sus valores
        /// </summary>
        private Dictionary<string, string> listOfFields;

        /// <summary>
        /// Lista que contiene los detalles de la factura de la plantilla
        /// </summary>
        public List<TypeLineDetails> lineDetails;

        /// <summary>
        /// Lista que contiene los descuentos generales
        /// </summary>
        public List<GeneralDiscountType> generalDiscount;

        #endregion

        #region "Properties"

        /// <summary>
        /// Campo con los totales de la factura
        /// </summary>
        public Totals Totals { get; set; }

        #endregion

        #region "Contructors"

        /// <summary>
        /// Contructor
        /// </summary>
        public FacturaeFieldAndValues()
        {
            listOfFields = new Dictionary<string, string>();
            lineDetails = new List<TypeLineDetails>();
            generalDiscount = new List<GeneralDiscountType>();
            Totals = new Totals();
        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método que incluye en el diccionario de datos un nuevo data con su nombre y su valor
        /// </summary>
        /// <param name="fieldName">Nombre del datos</param>
        /// <param name="value">Valor del datos</param>
        public void setFieldAndValue(string fieldName, string value)
        {
            listOfFields.Add(fieldName, value);
        }


        /// <summary>
        /// Método que accede a un datos del diccionario através de su nombre
        /// </summary>
        /// <param name="fieldName">Nombre del datos a buscar</param>
        /// <returns>Valor del dato</returns>
        public string getValueByFieldName(string fieldName)
        {
            try
            {
                string v = listOfFields[fieldName];
                return v;
            }
            catch (Exception)
            {
                return "";
            }


        }

        /// <summary>
        /// Método que devuelve el diccionario de datos
        /// </summary>
        /// <returns>Diccionario de datos</returns>
        public Dictionary<string, string> getList() 
        {
            return listOfFields;
        }

        #endregion

    }


    /// <summary>
    /// Clase que define el tipo de datos del diccionario de datos
    /// </summary>
    public class FieldValuesType
    {

        #region "Properties"

        /// <summary>
        /// Campo de tipo string que almacena el nomre identificativo del dato
        /// </summary>
        public string FieldName { get; set; }

        /// <summary>
        /// Campo de tipo string que almacena el valor del dato
        /// </summary>
        public string Value { get; set; }

        #endregion
    }


    /// <summary>
    /// Clase que define el tipo de dato de las lineas de detalles
    /// </summary>
    public class TypeLineDetails
    {

        #region "Properties"

        /// <summary>
        /// Propiedad de tipo string que almacena la descripción
        /// </summary>
        public string Descripcion { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena la cantidad
        /// </summary>
        public string Quantity { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el precio unitario
        /// </summary>
        public string UnitPriceWithoutTax { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el porcentaje de descuento
        /// </summary>
        public string DiscountRate { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe del descuento
        /// </summary>
        public string DiscountAmount { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el porcentaje del impuesto (IVA)
        /// </summary>
        public string TaxRate { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe del impuesto (IVA)
        /// </summary>
        public string TaxAmount { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena  el porcentaje del impuesto (IRPF)
        /// </summary>
        public string IRPFTaxRate { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe del impuesto (IRPF)
        /// </summary>
        public string IRPFAmount { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe de la base imponible
        /// </summary>
        public string BaseImponible { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe total de la linea sin descuento
        /// </summary>
        public string ImpBrutoSinDecuento { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe total de la linea
        /// </summary>
        public string TotalImport { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena la fecha
        /// </summary>
        public string TransactionDate { get; set; }

        #endregion

    }


    /// <summary>
    /// Clase que define el tipo de dato de los descuentos generales
    /// </summary>
    public class GeneralDiscountType
    {
        #region "Properties"

        /// <summary>
        /// Propiedad de tipo string que almacena la razón del descuento
        /// </summary>
        public string Reason { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el porcentaje del descuento
        /// </summary>
        public string discountRate { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe del descuento
        /// </summary>
        public string totalDescuento { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena la base imponible sobre la que se aplica el descuento
        /// </summary>
        public string baseImponible { get; set; }

        #endregion

    }


    /// <summary>
    /// Clase que define el tipo de dato de los totales
    /// </summary>
    public class Totals
    {
        #region "Properties"

        /// <summary>
        /// Propiedad de tipo string que almacena el importe bruto total antes de impuestos
        /// </summary>
        public string TotalGrossAmountBeforeTaxes { get; set; }

        /// <summary>
        /// Propiedad de tipo string que almacena el importe total de los impuestos repercutidos
        /// </summary>
        public string TotalTaxOutputs { get; set; }
        /// <summary>
        /// Propiedad de tipo string que almacena el importe bruto
        /// </summary>
        public string TotalGrossAmount { get; set; }
        /// <summary>
        /// Propiedad de tipo string que almacena el importe total de los descuentos
        /// </summary>
        public string TotalGeneralDiscounts { get; set; }
        /// <summary>
        /// Propiedad de tipo string que almacena el importe total de la factura a pagar
        /// </summary>
        public string TotalExecutableAmount { get; set; }

        #endregion

    }
}
